//
// Created by 啊汤哥 on 2025/6/20.
//

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
//
// #define MaxSize 10
//
// typedef struct {
//     int data[MaxSize];
//     int length;
// } SqList;
//
// void InitList(SqList &L) {
//     L.length = 0;
// }
//
// bool ListInsert(SqList &L, int i, int e) {
//     if (i < 1 || i > L.length + 1) {
//         return false;
//     }
//     if (L.length >= MaxSize) {
//         return false;
//     }
//     for (int j = L.length; j >= i; j--) {
//         L.data[j] = L.data[j - 1];
//     }
//     L.data[i - 1] = e;
//     L.length++;
//     return true;
// }
//
// bool ListDelete(SqList &L, int i, int &e) {
//     if (i < 1 || i > L.length) {
//         return false;
//     }
//     e = L.data[i - 1];
//     for (int j = i; j < L.length; j++) {
//         L.data[j - 1] = L.data[j];
//     }
//     L.length--;
//     return true;
// }
//
// void PrintList(SqList L) {
//     printf("Sequence table content：");
//     for (int i = 0; i < L.length; i++) {
//         printf("%d ", L.data[i]);
//     }
//     printf("\nCurrent length：%d / Max size：%d\n", L.length);
// };
//
//
// int main() {
//     SqList L;
//     InitList(L);  // 初始化顺序表
//
//     // 测试插入功能
//     for (int i = 1; i <= 5; i++) {
//         ListInsert(L, i, i * 10);  // 插入10,20,30,40,50
//     }
//     PrintList(L);
//
//     printf("====del text ==== \n");
//
//     int deleteValue;
//     if (ListDelete(L, 3, deleteValue)) {
//         printf("delete value: %d\n", deleteValue);
//     } else {
//         printf("delete fail");
//     }
//
//     PrintList(L);
//
//     return 0;
// }


// 单链表

typedef struct LNode {
    int data; // 数据域
    struct LNode *next; // 指针域，指向后继元素
}LNode, *LinkList; // 结构体 别名

// 链表初始话 -- 初始话一个不带头结点的单链表

bool InitList(LinkList &L) {
    L = NULL;
    return true;
}

// 不带头节点插入的操作
bool LinkInsert(LinkList &L, int i, int e) {
    LNode *newNode, *preNode;
    // 如果插入的是头结点
    if (i == 1) {
        newNode =(LNode *) malloc(sizeof(LNode));
        newNode->data = e;
        newNode->next = L;
        L = newNode; // 头指针指向新的节点
        return true;
    }
    int j = 1; // 当前指向是第几个节点
    preNode = L; // 指向的是第一个节点
    // 循环找到i-1 这个节点
    while (preNode != NULL && j < i-1) {
        preNode = preNode->next;
        j++;
    }

    if (preNode == NULL) {
        return false;
    }
    newNode = (LNode*)malloc(sizeof(LNode));
    newNode->data = e;
    newNode->next = preNode->next;
    preNode->next = newNode;
    return true;

}


// 指定节点的后插操作

bool InsertNextNode(LNode *p, int e) {
    if (p == NULL) return false;
    LNode *newNode = (LNode *) malloc(sizeof(LNode));
    if (newNode == NULL) return false;
    newNode->data = e;
    newNode->next = p->next;
    p->next = newNode;
    return true;
}
// 指定节点的前插操作
bool InsertProNode(LNode *p, int e) {
    if (p == NULL) return false;
    LNode *newNode = (LNode *) malloc(sizeof(LNode));
    if (newNode == NULL) return false;
    newNode->next = p->next;
    p->next = newNode;
    newNode->data = p->data;
    p->data = e;
    return true;
}

// 删除第i个元素，并且返回这个值
bool LinkDelete(LinkList &L, int i, int &e) {
    if (i < 1) return false;
    LNode * curNode, *delNode; // 指针指向当前的节点 删除节点
    int j = 0;
    curNode = L;
    // 循环找到对应的节点
    while (curNode != NULL && j<i-1) {
        curNode = curNode->next;
        j++;
    }
    if (curNode == NULL) return false;
    // delNode 指向被删除的节点
    delNode = curNode->next;
    e = delNode->data;
    curNode->next = delNode->next;
    free(delNode);
    return true;
}



// 删除指定节点 p
bool DeleteNode(LNode *p) {
    if (p == NULL) return false;
    // subNode 指向的是后继节点
    LNode *subNode = p->next;
    // 往下去移动一个位置
    p->data = p->next->data;
    p->next = subNode->next;
    free(subNode);
    return true;
}


// 删除最后一个节点p
bool DeleteFinallyNode(LNode *p) {
    if (p == NULL) return false;

    // 如果 p 是最后一个节点
    if (p->next == NULL) {
        free(p);
        return true;
    }

    // subNode 指向的是后继节点
    LNode *subNode = p->next;
    // 往下去移动一个位置
    p->data = p->next->data;
    p->next = subNode->next;
    free(subNode);
    return true;
}


// 判断链表是否为空
bool Empty(LinkList L) {
    if (L == NULL) return false;
    else return true;
}










